spb/note-spboucher-ai
Public
1import { z } from "zod";2import { handler, parseBody } from "@/lib/api";3import { getDatabase, updateDatabase, queryRows } from "@/lib/databases/service";4import { exportCsv } from "@/lib/databases/csv";5import { audit } from "@/lib/audit";6/** GET by database id OR host page id. ?format=csv[&viewId=] exports the rows. */7export const GET = handler(async ({ ws, params, req }) => {8 const d = await getDatabase(ws.id, params.id); const u = new URL(req.url);9 if (u.searchParams.get("format") === "csv") {10 const view = d.views.find((v) => v.id === u.searchParams.get("viewId")); const r = await queryRows(d.id, d.properties, { filter: view?.config.filter ?? null, sorts: view?.config.sorts ?? [], limit: 1000 });11 return new Response(exportCsv(d.properties, r.rows, view?.config.hidden ?? []), { headers: { "content-type": "text/csv; charset=utf-8", "content-disposition": `attachment; filename="${d.name.replace(/[^\w.-]+/g, "_") || "database"}.csv"` } });12 }13 return Response.json(d);14});15export const PATCH = handler(async ({ ws, params, req, user }) => {16 const b = await parseBody(req, z.object({ name: z.string().max(500).optional(), description: z.string().max(2000).nullable().optional(), icon: z.string().max(16).nullable().optional(), isTemplate: z.boolean().optional() }));17 const d = await updateDatabase(ws.id, params.id, b); await audit(user.id, "database.update", { type: "database", id: d.id }, { keys: Object.keys(b) });18 return Response.json(d);19});20